package com.mark.web.sys.mapper;

import com.mark.web.sys.entity.po.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @Description: 用户模块操作数据的接口定义
 * @Author: Kingsley
 * @CreateDate: 2018/12/2 19:08：46
 * @Version: 2.0
 * @Copyright : 豆浆油条个人非正式工作室
 */
@Mapper
public interface UserMapper {

    /**
     * 1.用户注册
     *
     * @param record ： 用户对象
     * @return ： 响应的行数
     */
    int insert(User record);

    //----尚未用到的接口
    int deleteByPrimaryKey(Integer id);

    /**
     * 更新用户信息
     *
     * @param record：用户对象信息
     * @return ：更新成功返回1
     */
    int updateByPrimaryKeySelective(User record);

    /**
     * 修改密码
     *
     * @param username：用户名
     * @param passwordNew:新密码
     * @return ： 影响的行数
     */
    int updatePasswordByUsername(@Param("username") String username,
                                 @Param("passwordNew") String passwordNew);

    /**
     * 更改用户的状态
     *
     * @param id：用户id
     * @param remark：备注
     * @param status：状态
     * @return ：影响的行数
     */
    int updateStatusByPrimaryKey(@Param("id") Integer id,
                                 @Param("remark") String remark,
                                 @Param("enableStatus") Integer status);

    /**
     * 根据用户id获取个人信息
     *
     * @param id :用户id
     * @return ：User
     */
    User selectByPrimaryKey(Integer id);

    /**
     * 校验用户是否已经存在
     * @param username ：用户名
     * @return ：返回该用户名存在的行数，即用户不存在时返回0
     */
    int checkUserName(String username);

    /**
     * 校验邮箱
     * @param email :邮箱
     * @return ：返回改邮箱在数据库中已经存在的记录数，即电子邮箱不存在返回0
     */
    int checkEmail(String email);

    /**
     * 校验手机号码
     *
     * @param phone ： 手机号码
     * @return ：影响的行数
     */
    int checkPhone(String phone);

    /**
     * 用户登录
     *
     * @param username : 用户名
     * @param email ： 邮箱
     * @param phone ：电话号码
     * @param password ：密码
     * @return ：用户对象
     */
    User selectLogin(@Param("username") String username,
                     @Param("email") String email,
                     @Param("phone") String phone,
                     @Param("typeValue") String typeValue,
                     @Param("password") String password);

    /**
     * 根据用户名找回问题信息
     *
     * @param username ：用户名
     * @return ：问题
     */
    String selectQuestionByUserName(String username);

    /**
     *检查答案
     *
     * @param username:用户名
     * @param question：问题
     * @param answer：回答问题的答案
     * @return ：总的行数
     */
    int checkAnswer(@Param("username") String username,
                    @Param("question") String question,
                    @Param("answer") String answer);

    /**
     *检查旧密码
     *
     * @param passwordOld：旧密码
     * @param id：用户id
     * @return ： 总的行数
     */
    int checkPassword(@Param("passwordOld") String passwordOld,
                      @Param("id") Integer id);


    /**
     * 查找非当前用户的用户名（更新用户信息调用）
     *
     * @param username：用户名
     * @param id：用户id
     * @return ：总的行数，如果找不到返回0
     */
    int checkUsernameByUserId(@Param("username") String username, @Param("id") Integer id);

    /**
     * 查找非当前用户id的邮箱（更新用户信息调用）
     *
     * @param email ：邮箱
     * @param id ：用户id
     * @return ： 总的行数，如果找不到返回0
     */
    int checkEmailByUserId(@Param("email") String email, @Param("id") Integer id);

    /**
     * 查找非当前用户的手机号（更新用户信息调用）
     *
     * @param phone ：手机号
     * @param id：用户id
     * @return ：总的行数，如果找不到返回0
     */
    int checkPhoneByUserId(@Param("phone") String phone, @Param("id") Integer id);

    ///------------------------以下是实现后台接口业务的数据交互接口定义------------------------------------------

    /**
     * 查找所有的用户
     * @return ： 所有的用户列表信息
     */
    List<User> selectList();

    /**
     *检索哟用户信息
     * @param userName：用户名
     * @param userId：用户id
     * @param status：状态
     * @return ：用户列表信息
     */
    List<User> searchUsers(@Param("userName") String userName,
                           @Param("userId") Integer userId,
                           @Param("enableStatus") Integer status);


    /**
     * 统计用户总数
     * @param role ：用户角色
     * @return ：总的行数
     */
    int selectCount(@Param("role") Integer role);

}